package com.mobile.weather.service;

import com.mobile.weather.domain.WeatherResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class WeatherServiceImpl implements WeatherService {

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    RestTemplate restTemplate;

    @Override
    public WeatherResponse accessThressRedisSnow(String city){

        String url="https://apis.tianapi.com/tianqi/index?key="+"2af8ed08605c20f76f8183d1b702474b"+"&city="+city+"&type=7";
        System.out.println("url:"+url);
        /**
         * 思路：先查询缓存，缓存没有的话再查询第三方接口
         */
        //1.先查询缓存
        WeatherResponse weatherResponse=(WeatherResponse) redisTemplate.opsForHash().get("mobileweatherdata",city);
        System.out.println("weatherResponse:"+weatherResponse);
//        if(weatherResponse!=null){
//            System.out.println("从缓存中取出的result："+weatherResponse.getResult());
//            System.out.println("从缓存中取出的城市名称："+weatherResponse.getResult().getArea());
//        }
        //模拟一下：200万个请求同时打过来
        //策略：让并发请求变成有序请求  一个一个按顺序来  使用锁
        if(weatherResponse==null){  //100个人同时请求广州的天气数据
            System.out.println("当你看到这行代码的时候，说明我没有从缓存中拿到数据，需要额外访问第三方接口。。。。。。。。。。。。。。");
            //2.没有的话  缓存没有的话再查询第三方接口
            synchronized (this){

                //双重检查，再查一次缓存
                weatherResponse=(WeatherResponse) redisTemplate.opsForHash().get("mobileweatherdata",city);

                if(weatherResponse==null){

                    weatherResponse=restTemplate.getForObject(url, WeatherResponse.class);  //这行代码很消耗时间

                    //3.把数据放入缓存
                    redisTemplate.opsForHash().put("mobileweatherdata",city,weatherResponse);
                }
            }
        }
        return weatherResponse;
    }

}
